iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0

今天來模擬一下後端的工作

後端的工作流程

複習一下前幾天講到的流程,後端的主要工作是:

  • 拿到前端給的、第三方登入給予的 token
  • 將第三方給予的 token 送到第三方服務驗證、索取 user 資料
  • 確認收到 user 資料,存入 database
  • 生成網站 token 給予前端,確認使用者合格

https://ithelp.ithome.com.tw/upload/images/20231014/20162893WLaEmKOtGU.png

前端向第三方服務登入驗證,將 Token 傳給後端

當前端向第三方服務驗證取得 token 後,我讓網頁直接 show 出 token

public function callback()
{
    $lineUser = Socialite::driver('line')->stateless()->user();
    return $lineUser->actoken;
}

傳 token 這部分因為實務上在前端處理,這裡待會就手動複製、用 postman 模擬前端打後端的情形

routes/api.php

我建立一支 API 讓前端 call 後端,傳送 token 過來使用

Route::prefix('/auth')->group(function () {
   Route::post('/tokenValidation', [ThirdPartyAuthController::class, 'tokenValidation']);
});

app/Http/Controllers/ThirdPartyAuthController.php

public function tokenValidation(Request $request)
{
    try {
        $user = Socialite::driver('line')
            ->stateless() 
                //此次驗證請求不需使用 Session,使請求更輕量化
            ->userFromToken($request->input('access_token'));
                // 用前端傳過來(第三方傳給User)的 token,重新向第三方服務驗證此Token是否正確,並取得user資料
    } catch (\Throwable $exception) { //Throwable可同時捕捉到 exception 和 error
        logger()->error('取得第三方使用者失敗', ['exception' => $exception]);
            // 可以用 terminal 指令 tail -f storage/logs/laravel.log 查閱
        abort(Response::HTTP_UNAUTHORIZED);
    }
    User::updateOrCreate([
        'email' => $user->email,
    ],[
        'line_id' => $user->id,
        'name' => $user->name,
        'image_path' => $user->avatar,
				'email_verified_at' => now(),
    ]);
    return '第三方驗證成功';
    }

用 postman 測試

把 token 放入表單裡面,用 post 方法打向我剛剛設定的 api,成功取得資料啦
https://ithelp.ithome.com.tw/upload/images/20231014/20162893s7q7n51M9B.png
不過當我在驗證 token ,不知道為什麼用驗證token取得的資料無法取得使用者email,導致我在傳入後端資料庫建立或驗證使用者資料時會有問題(因為我用 email 當作 primary key,所以一定要有 email )

這個問題我自己認為應該是 Laravel Socialite 套件與 Line login 沒有完全相容導致,

  • Laravel 官方文件提到 Socialite 裡面的 userFromToken($token) 方法進行驗證;
  • 而 Line API 提供許多 token API 驗證方法,包含 access_token及 id_token,最外層還有個token
    https://ithelp.ithome.com.tw/upload/images/20231023/20162893G3vVht0adD.png
  • 如果直接用 postman 打 api 且使用 id_token 驗證的話是可以拿到資料的,
    https://ithelp.ithome.com.tw/upload/images/20231023/20162893c6ZedcxE1q.png
  • 但用 Laravel Socialite 的 userFromToken() 方法放入 id_token 則會報錯

生成網站 token:app/Http/Controllers/ThirdPartyAuthController.php

private function respondWithToken(User $user)
{
    $guard = Auth::guard('api');
    $tokenLife = 60 * 24 * 365; //unit:minute (for one year)
    $token = $guard->setTTL($tokenLife)->login($user);

    return \response()->json([
        'data' => [
            'access_token' => $token,
            'expires_in' => $tokenLife * 60,
            'has_verified_email' => $user->hasVerifiedEmail(),
            'token_type' => 'bearer',
        ],
    ]);
}

上一篇
Laravel Socialite / Line 第三方登入(2)
下一篇
Day 30 完賽心得
系列文
Laravel 後端菜鳥可以知道的流程概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言